/*
    该函数将 n x n 的二维矩阵顺时针旋转 90 度，要求原地操作。
    思路：
    1. 一圈一圈处理（从最外层往内），每圈四条边一组；
    2. 每圈旋转 curLen - 1 次；
    3. 使用 offset 表示当前圈的起点（左上角坐标）；
*/

// step 1# 主函数：顺时针旋转二维矩阵
void rotate(int** matrix, int matrixSize, int* matrixColSize) {
    int n = matrixSize;      // 矩阵大小为 n x n
    int loop = n / 2;        // step 2# 总共要处理 loop 圈（n / 2 层）
    int offset = 0;          // 当前圈的起点坐标（左上角的行/列号）

    // step 3# 处理每一圈，直到处理完全部圈层
    while (loop) {
        int curLen = n - (2 * offset);  // 当前圈的边长（等于 n - 2*offset）

        // step 4# 每圈旋转 curLen - 1 次，每次处理四个位置的值交换
        for (int i = 0; i < curLen - 1; i++) {
            // step 5# 保存四个边上的点
            int sideA = matrix[offset][offset + i];                         // 上边（左→右）
            int sideB = matrix[offset + i][n - offset - 1];                 // 右边（上→下）
            int sideC = matrix[n - offset - 1][n - offset - 1 - i];         // 下边（右→左）
            int sideD = matrix[n - offset - 1 - i][offset];                 // 左边（下→上）

            // step 6# 四点顺时针交换
            matrix[offset][offset + i] = sideD;                             // 上边 → 上边
            matrix[n - offset - 1 - i][offset] = sideC;                     // 右边 → 左边
            matrix[n - offset - 1][n - offset - 1 - i] = sideB;             // 下边 → 下边
            matrix[offset + i][n - offset - 1] = sideA;                     // 左边 → 右边
        }

        // step 7# 进入下一圈
        loop--;       // 剩余圈数减 1
        offset++;     // 圈层起点向内收缩一圈
    }
}
